// 给所有的函数添加一个hucall的方法
Function.prototype.hycall = function (thisArg, ...args) {
  // 在这里可以去执行调用的那个函数(foo)
  // 问题：怎么获取到是哪一个函数执行了hycall

  // 获取需要被执行的函数
  var fn = this;
  // 对thisArg转成对象类型(防止它传入的是非对象类型)
  thisArg =
    thisArg !== null && thisArg !== undefined ? Object(thisArg) : window;
  // 调用需要被执行的函数
  thisArg.fn = fn;
  var result = thisArg.fn(...args);
  delete thisArg.fn;

  // 将最终结果返回
  return result;
};

function foo() {
  console.log("foo函数被执行", this);
}

function sum(num1, num2) {
  console.log("sum函数被执行", this, num1, num2);
  return num1 + num2;
}

// 系统的函数的call方法
// foo.call("abc");

// 自己实现的函数的hycall方法
// 默认进行了隐式绑定
// foo.hycall({ name: "frank" });
// foo.hycall(123);
var res = sum.hycall({ name: "frank" }, 20, 30);
console.log(res);
